function f_check_file_timestamp()
{ #判断检查任务的标志文件是否还在更新
    declare _check_file_name _check_state __ fun_name
    fun_name="f_check_file_timestamp"
    _check_file_name="${1}"
    if [ -f "${_check_file_name}" ]                        #判断这个文件是否近期被更新, 因为这个文件每秒会写时间戳进去
    then
        _check_state=0
        __="$(cat ${_check_file_name}|awk '{print $1}'|sed 's/[^0-9]//g')"   #获取这个文件的时间戳
        sleep 1
        [ -z "${__}" ] && return 0                         #有可能这个文件的时间戳是空的, 正在被写, 且cat就是这种情况 , 如果是空就continue
        __="$(($(date +%s)-${__}))"                        #判断时间戳与当前时间戳的差值, 如果超过60秒就视为异常, 检查mdl的任务异常
        [ -z "${__}" ] && return 0                         #有可能这个文件的时间戳是空的, 正在被写, 且cat就是这种情况 , 如果是空就continue
        [ ${__} -gt 60 ] && _check_state=1                 #判空
    else
        _check_state=1                                     #不存在文件就说明检查任务结束
    fi
    return ${_check_state}
}

function f_check_daemonize()
{   #检查mdl和检查连接数的任务是放在后台跑, 有可能是出现异常, 如果异常就做如下处理
    sleep 10
    declare break_mark1 break_mark2 _osc_is_run _check_T_ _check_t_ _check_count fun_name
    fun_name="f_check_daemonize"
    _check_T_="${1}"
    _check_t_="${2}"
    _check_count=0 #检查次数, 目的是10min检查一次磁盘空间
    while :
    do
        _check_count="$((${_check_count}+1))"
        [ "$((${_check_count}%120))x" == "0x" ] && f_check_disk_for_node "${_check_count}" || true #两分钟检查一次磁盘空间
        if [ -f "${bug_mark_file}" ]
        then #如果满足这个条件, 则可能是触发了ghost的bug, 目前没找到解决问题的办法
             #bug的现象就是, ghost执行后不做任何操作, 通过debug参数去看就是卡着了, 不反悔执行状态, 也不会生成临时表(_xxx_ghc, _xxx_gho这种表)
            if [ "$(cat ${bug_mark_file})x" == "0x" ]
            then #这种情况不删除${bug_mark_file}文件, 用于判断是否使用pt进行重做
                __="'${mysql_host}:${mysql_port}' gh-ost长时间处于没有copy data状态, 可能遇到gh-ost的bug, 详情请看 '${res_log}'. 现在尝试使用pt重新改表!!!"
            elif [ "$(cat ${bug_mark_file})x" == "1x" ]
            then #这种情况删除${bug_mark_file}文件, 不使用pt进行重做
                __="'${mysql_host}:${mysql_port}' gh-ost长时间处于copy data 100%状态, 可能遇到gh-ost的bug, 详情请看 '${res_log}'. "
                __="${__} 也可能已经改表完成, 请dba查阅日志进行评估处理。如果需要重做, 建议DBA到管理机使用如下命令进行操作, 'bash ${work_dir}/${s_n} ${*} -C 0'"
                rm -f "${bug_mark_file}"
            fi

            f_logging "$(eval echo ${log_addr}):ERROR" "${__}" "2"
            f_kill_osc_process "${_check_T_}" "${mysql_host}" "${mysql_port}" "${mysql_db}" "${_check_t_}" "${mysql_user}" || true
            break
        elif [ ! -f "${osc_run_mark_file}" ]  #如果标志文件不存在, 则表示改表任务已经结束, 守护进程就退出
        then
            [ -f "${check_connect_file}" ] && rm -f ${check_connect_file}
            [ -f "${check_thread_file}" ] && rm -f ${check_thread_file}
            [ -f "${max_thread_file}" ] && rm -f ${max_thread_file}
            break
        fi

        __="$(ps -ef|grep -w "${mysql_db}"|grep -w "${_check_t_}"|grep -w "${mysql_port}"|grep -w "${_check_T_}"|grep -wc "${mysql_host}")" || true
        if [ "${__}x" == "0x" ]
        then #改表osc进程不在就break, 并尝试删除osc_run_mark_file文件
            { [ -f "${osc_run_mark_file}" ] && chattr -i ${osc_run_mark_file} && rm -f "${osc_run_mark_file}";} || true
            break
        fi

        f_check_file_timestamp "${check_connect_file}" && exe_state="${?}" || exe_state="${?}"

        if [ ${exe_state} -eq 0 ]
        then
            continue
        else
            break_mark1=1
        fi

        if [ -f "${check_mdl_mark_file}" ]                #判断这个文件是否近期被更新, 因为这个文件每秒会写时间戳进去
        then
            __="$(cat ${check_mdl_mark_file})"            #获取这个文件的时间戳
            [ -z "${__}" ] && continue                    #有可能这个文件的时间戳是空的, 正在被写, 且cat就是这种情况 , 如果是空就continue
            __="$(($(date +%s)-${__}))"                   #判断时间戳与当前时间戳的差值, 如果超过60秒就视为异常, 检查mdl的任务异常
            [ ${__} -gt 60 ] && break_mark2=1             #如果最后一次更新时间戳是60秒之前的, 就break, 视为检查函数已经异常
        else
            break_mark2=1                                 #不存在文件就说明检查任务结束
        fi
        [ "${break_mark1}x" == "1x" ] && [ "${break_mark2}x" == "1x" ] && break
        sleep 1
    done
    {
        [ -f "${check_mdl_mark_file}" ] && rm -f "${check_mdl_mark_file}"
        [ -f "${check_connect_file}" ] && rm -f "${check_connect_file}"
        [ -f "${check_thread_file}" ] && rm -f ${check_thread_file}
        [ -f "${max_thread_file}" ] && rm -f ${max_thread_file}
    } || true
}

